package cn.good.yan.service;

import cn.good.yan.entity.Storage;
import com.baomidou.mybatisplus.extension.service.IService;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/**
 * 库存服务
 *
 * @author shengren.yan
 * @create 2024-02-22
 */
@LocalTCC
public interface StorageService extends IService<Storage> {

    // 扣除 该产品 的仓库的库存  -- 正常
    void decrease(Long productId, Integer count);


    /**
     * 扣除 该产品 的仓库的库存  -- TCC模式，两阶段提交
     * commitMethod ：不需要回滚执行的逻辑 、rollbackMethod 需要回滚执行的逻辑
     *
     * @return String
     */
    @TwoPhaseBusinessAction(name = "changeStockTcc", commitMethod = "commitTcc", rollbackMethod = "cancel")
    void changeStockTcc(@BusinessActionContextParameter(paramName = "productId") Long productId,
                        @BusinessActionContextParameter(paramName = "count") Integer count);

    /**
     * 确认方法、 - 逻辑 ，不需要回滚执行这里
     * context可以传递try方法的参数
     *
     * @param context 上下文
     * @return boolean
     */
    boolean commitTcc(BusinessActionContext context);

    /**
     * 二阶段回滚方法  - 逻辑
     *
     * @param context 上下文
     * @return boolean
     */
    boolean cancel(BusinessActionContext context);


}
